package model

import (
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"gorm.io/gorm"
	"shorthand-go/dao/resource"
	"time"
)

// SysOrder 用户订单表
type SysOrder struct {
	ID            int64     `json:"id" gorm:"id"`                         // 主键
	OrderNo       string    `json:"order_no" gorm:"order_no"`             // 订单编号
	UserId        int64     `json:"user_id" gorm:"user_id"`               // 创建订单客户
	CourseType    string    `json:"course_type" gorm:"course_type"`       // 课程类型: CN、EN
	CourseCode    string    `json:"course_code" gorm:"course_code"`       // 课程编号
	CourseName    string    `json:"course_name" gorm:"course_name"`       // 课程名称
	CourseAmount  float64   `json:"course_amount" gorm:"course_amount"`   // 金额
	PayTime       time.Time `json:"pay_time" gorm:"pay_time"`             // 支付时间
	Status        string    `json:"status" gorm:"status"`                 // 支付状态: 1 未支付，2 已支付，3 已退款
	PayMethod     int8      `json:"pay_method" gorm:"pay_method"`         // 支付类型（1支付宝支付，2微信支付，3 Paypal）
	CreateBy      string    `json:"create_by" gorm:"create_by"`           // 创建人
	CreateTime    time.Time `json:"create_time" gorm:"create_time"`       // 创建时间
	Remark        string    `json:"remark" gorm:"remark"`                 // 备注
	DelFlag       string    `json:"del_flag" gorm:"del_flag"`             // 删除标记
	RecommendCode string    `json:"recommend_code" gorm:"recommend_code"` // 推荐码
	UpdateTime    time.Time `json:"update_time" gorm:"update_time"`       // 更新时间
	UpdateBy      string    `json:"update_by" gorm:"update_by"`           // 更新人
	ExpireTime    time.Time `json:"expire_time" gorm:"expire_time"`       // 有效期
}

type SysOrderModel struct {
	db *gorm.DB
}

// TableName 表名称
func (*SysOrderModel) TableName() string {
	return "sys_order"
}

// NewSysOrderModel 初始化 db
func NewSysOrderModel(ctx *gin.Context) *SysOrderModel {
	return &SysOrderModel{
		db: resource.MysqlClient.WithContext(ctx),
	}
}

// FindOne 根据订单号查询订单信息
func (m *SysOrderModel) FindOne(orderNo string) (*SysOrder, error) {
	data := new(SysOrder)
	err := m.db.Table(m.TableName()).Where("order_no = ?", orderNo).Where("del_flag = 0").Find(data).Error
	if err != nil {
		resource.Logger.Error("find sys_order error", zap.Error(err), zap.String("order_no", orderNo))
		return nil, err
	}
	return data, nil
}

// Update 根据订单号更新订单信息
func (m *SysOrderModel) Update(orderNo string) error {
	now := time.Now()
	err := m.db.Table(m.TableName()).
		Where("order_no = ?", orderNo).
		Where("del_flag = 0").
		Updates(map[string]any{
			"status":      2,
			"pay_time":    now,
			"update_time": now,
			"expire_time": now.Add(time.Hour * 24 * 365),
		}).Error

	if err != nil {
		resource.Logger.Error("update sys_order error", zap.Error(err), zap.String("order_no", orderNo))
		return err
	}
	return nil
}
